package eu.jakubiak.generators;

import java.util.Random;

/**
 * Klasa odpowiedzialna za generowania kluczy
 * zakodowana przy uzyciu alfabetu (małe i duże litery)
 * oraz cyfry
 * 
 */
public class KeyGenerator implements IGenerator {

	/**
	 * Utworznie statystycznie unikalnego klucza
	 * Klucz to bardzo duża liczba - większa od MD5 2^128
	 * zakodowana przy użyciu alfabetu oraz cyfr - 62znaki. 
	 * Dzięki użyciu wielu znaków klucz jest krótszy niż 
	 * md5 zakodwoana 16.
	 * 
	 * md5 zakodowana hex potrzebuje 32 znaków,
	 * w kluczach kodowanych alfabetem wystarczą 22 znaki.
	 * Niby nie dużo, jednak jest jeszcze jedna zalata
	 * - sortowanie i indeksowanie w bazie danych.
	 * 
	 * http://www.wolframalpha.com/input/?i=(26+%2B+26+%2B+10)^22+>+2^128
	 */
	public String generate() {
		return generate(22);
	}
	
	
	/**
	 * Utworzenie klucza o zadanej długości
	 * 
	 * @param length
	 *            długość hasła
	 * @return
	 */
	public String generate(int length) {
		Random r = new Random();
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < length; i++) {
			sb.append(CHARS[r.nextInt(CHARS.length)]);
		}
		return sb.toString();
	}

	/**
	 * Zbiór znaków do kodowania klucza
	 * 26 małych liter alfabetu + 26 dużych liter + 10 cyfr
	 * to daje 62 znaki
	 */
	public static final char[] CHARS = { 
		'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
		'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
		'0','1','2','3','4','5','6','7','8','9', 
    };

}
